home *** CD-ROM | disk | FTP | other *** search
/ System Booster / System Booster.iso / SYS / s / build.rexx < prev    next >
OS/2 REXX Batch file  |  1996-09-26  |  5KB  |  173 lines

  1. /*
  2.  * A hack to make building other programs easier, by extracting the
  3.  * commands needed to build the file from it's source.
  4.  *
  5.  *    build [name NAME] [flags COMMAND=FLAGS ...] [file] FILE [FILE ...] 
  6.  *
  7.  * Name defaults to "build". Flags causes the following arguments to be parsed
  8.  * for extra flags to be added to each COMMAND. All input FILEs are scanned
  9.  * for build lines to be issued to the system. If flags is present, file is
  10.  * required.
  11.  *
  12.  * In scanning a file, build ignores all lines until it sees a line containing
  13.  * the string "===NAME", for whatever value name has, defaulting to build. All
  14.  * lines following are then processed until a line containing "===endNAME" is
  15.  * encountered. Delimiter and control are set by parsing the line ===NAME line
  16.  * as '===NAME delimiter DELIMITER control CONTROL'
  17.  *
  18.  * In processing the build lines, two tokens have special significance. They
  19.  * are called delimiter and control, and are normally '%' and ';'. The line is
  20.  * first split on the control character, into the front and back halves. If
  21.  * there is a delimiter in the front half, any text preceding it is discarded.
  22.  * If there is a delimiter in the back half, any text following it is discarded.
  23.  *
  24.  * The front half is treated as a command to be issued to the system. If the
  25.  * first word of the front half is matched by a the command part of a flags
  26.  * argument, then the flags part of that argument is inserted into the command
  27.  * after the first word. I.e. the command issued is "command FLAGS rest of line".
  28.  * The back half of the command is then checked, and the above comamnd is issued
  29.  * if it is called for.
  30.  *
  31.  * The back half is assumed to be of the form 'output= FILE input= FILE ...'.
  32.  * If any of the input files are newer than the output file, then the command
  33.  * in the front half will be executed.  If either input or output keywords are
  34.  * missing, the command is always issued.
  35.  *
  36.  * As a convenience, if the back half of a line is empty, then it will be
  37.  * executed if the previous command was executed.
  38.  *
  39.  * Copyright 1991, Mike Meyer
  40.  * All Rights Reserved
  41.  *
  42.  * See the file "Supersaver:Distribution" for information on distribution.
  43.  */
  44.  
  45. /* Get the support code */
  46. if ~show('Libraries', 'rexxsupport.library') then do
  47.     if ~addlib('rexxsupport.library', 0, -30) then do
  48.         say "Can't open rexxsupport.library!"
  49.         exit
  50.         end
  51.     end
  52.  
  53. flags. = ''
  54. flags = 0
  55. name = 'build'
  56. files = ''
  57.  
  58. /* Parse them arguments */
  59. args = arg(1)
  60. do i = 1 to words(args)
  61.     select
  62.         when upper(word(args, i)) = 'NAME' then do
  63.             flags = 0
  64.             i = i + 1
  65.             name = word(args, i)
  66.             end
  67.         when upper(word(args, i)) = 'FILE' then do
  68.             flags = 0
  69.             i = i + 1
  70.             files = word(args, i)
  71.             end
  72.         when upper(word(args, i)) = 'FLAGS' then flags = 1
  73.         when flags then do
  74.             parse value word(args, i) with command '=' flag
  75.             if flag = '' then
  76.                 flags.currentcommand = flags.currentcommand word(args, i)
  77.             else do
  78.                 currentcommand = command
  79.                 flags.command = flag
  80.                 end
  81.             end
  82.         otherwise files = files word(args, i)
  83.         end
  84.     end
  85.  
  86. /*
  87.  * loop over the file names.
  88.  */
  89. files = expand(files)
  90. do i = 1 to words(files)
  91.     call buildfile(word(files, i), name)
  92.     end
  93.  
  94. exit 0
  95.  
  96. /*
  97.  * Scan a file, looking for the build instructions.
  98.  */
  99. buildfile: procedure expose flags.
  100.     parse arg file, name
  101.  
  102.     delim = '%'
  103.     control = ';'
  104.  
  105.     if ~open(input, file) then do
  106.         say "Can't open file" file
  107.         return 10
  108.         end
  109.  
  110.     /* Search for the section with command in it */
  111.     search = '==='upper(name)
  112.     do until index(upper(line), search) ~= 0
  113.         if eof(input) then do
  114.             say "No actions found for" name "in file" file
  115.             return 5
  116.             end
  117.         line = readln(input)
  118.         end
  119.  
  120.     /* Check for control/delimter settings */
  121.     parse var line 'control' new .
  122.     if new ~= '' then control = new
  123.     parse var line 'delimiter' new .
  124.     if new ~= '' then delimiter = new
  125.  
  126.     /* Process the command lines */
  127.     search = '===END'upper(name)
  128.     line = readln(input)
  129.     do while index(upper(line), search) = 0
  130.         parse var line command (control) files
  131.  
  132.         /* Check files section */
  133.         parse var files files (delim)
  134.         parse var files "output=" outfile "input=" infiles
  135.         if outfile = "" | infiles = "" then docommand = 1
  136.         else do
  137.             instamp = makestamp(strip(outfile))
  138.             docommand = 0
  139.             do i = 1 to words(infiles)
  140.                 if instamp < makestamp(word(infiles, i)) then do
  141.                     docommand = 1
  142.                     leave
  143.                     end
  144.                 end
  145.             end
  146.  
  147.         /* Build command to execute */ 
  148.         parse var command (delim) new flags
  149.         if new ~= "" then command = new
  150.         else parse var command command flags
  151.         if command ~= "" & docommand then do
  152.             say command flags
  153.             address command command flags.command flags
  154.             if rc ~= 0 then exit rc
  155.             end
  156.         line = readln(input)
  157.  
  158.         if eof(input) then do
  159.             say "No end to build section"
  160.             exit 10
  161.             end
  162.         end
  163.  
  164.     call close input
  165.     return 0
  166.  
  167. /* Get a files creation date as a numeric string */
  168. makestamp: procedure
  169.     arg filename
  170.  
  171.     parse value statef(filename) with . . . . d m t .
  172.     return right(d, 4, 0) || right(m, 4, 0) || right(t, 4, 0)
  173.